
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2007, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Internal timer callback.
//
///////////////////////////////////////////////////////////////////////////////

#include "Timer.h"
#include "TimerImpl.h"

#include "Usul/Functions/SafeCall.h"

#include "boost/bind.hpp"

USUL_IMPLEMENT_IUNKNOWN_MEMBERS ( Timer, Timer::BaseClass );

///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

Timer::Timer ( unsigned int milliseconds, Callback callback, bool singleShot ) : BaseClass(),
  _impl ( new TimerImpl ( milliseconds, callback, singleShot ) )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

Timer::~Timer()
{
  Usul::Functions::safeCall ( boost::bind ( &Timer::_destroy, this ), "4218934207" );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor contents.
//
///////////////////////////////////////////////////////////////////////////////

void Timer::_destroy()
{
  // Stop the timer if it's running.
  this->stop();

  delete _impl;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Query for the interface.
//
///////////////////////////////////////////////////////////////////////////////

Usul::Interfaces::IUnknown *Timer::queryInterface ( unsigned long iid )
{
  // No need to guard, should be re-entrant.
  
  switch ( iid )
  {
  case Usul::Interfaces::IUnknown::IID:
  case Minerva::Common::ITimer::IID:
    return static_cast < Minerva::Common::ITimer * > ( this );
  default:
    return 0x0;
  }
}


///////////////////////////////////////////////////////////////////////////////
//
//  Start the timer.
//
///////////////////////////////////////////////////////////////////////////////

void Timer::start()
{
  _impl->start();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Stop the timer.
//
///////////////////////////////////////////////////////////////////////////////

void Timer::stop()
{
  _impl->stop();
}
